# tests/CMakeLists.txt
#
# Configure the file which all CMake tests will include
configure_file( include.ctest.sh.in  include.ctest.sh @ONLY )

execute_process( COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/include.sh ${CMAKE_CURRENT_BINARY_DIR} )
execute_process( COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/utils.sh   ${CMAKE_CURRENT_BINARY_DIR} )
execute_process( COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/number_compare.pl ${CMAKE_CURRENT_BINARY_DIR} )

# Build the executables used by test scripts
################################################
list(APPEND test_bins
    list_codetable_flagtable_keys
    grib_bpv_limit
    grib_double_cmp
    read_any
    julian
    grib_indexing
    grib_multi_from_message
    grib_read_index
    unit_tests
    bufr_keys_iter
    gauss_sub
    grib_nearest_test
    grib_util_set_spec
    grib_check_param_concepts
    grib_local_MeteoFrance
    grib_2nd_order_numValues
    grib_optimize_scaling
    grib_optimize_scaling_sh
    grib_ecc-386
    bufr_ecc-517
    bufr_get_element
    bufr_extract_headers
    extract_offsets
    bufr_check_descriptors
    grib_sh_ieee64
    ieee
    grib_set_bytes
    grib_packing_order
    grib_sh_imag
    grib_sh_spectral_complex
    grib_lam_bf
    grib_lam_gp)

foreach( tool ${test_bins} )
    # here we use the fact that each tool has only one C file that matches its name
    ecbuild_add_executable( TARGET    ${tool}
                            NOINSTALL
                            SOURCES   ${tool}.c
                            LIBS      eccodes )
endforeach()

# Now add each test (shell scripts)
#################################################
if( HAVE_BUILD_TOOLS )

    # These tests do not require any data downloads
    list(APPEND tests_no_data_reqd
        unit_tests
        julian
        grib_dump_samples
        bufr_dump_samples
        bufr_check_descriptors
        definitions
        grib2_version
        grib_calendar
        grib_md5
        grib_cfNames
        grib_packing_order
        filter_substr
        grib_uerra
        grib_element
        grib_2nd_order_numValues
        grib_ecc-136
        grib_ecc-966
        grib_ecc-967
        grib_ecc-1150
        grib_ecc-1053
        grib_ecc-1065
        grib_ecc-1167
        grib_ecc-1170
        grib_ecc-1195
        grib_ecc-1212
        grib_ecc-1230
        bufr_ecc-1195
        bufr_json_samples
        bufr_ecc-359
        bufr_ecc-517
        bufr_rdbSubTypes
        bufr_templates
        grib_efas
        grib_sh_imag
        grib_sh_spectral_complex
        pseudo_diag
        grib_levtype
        grib_grid_unstructured
        grib_grid_lambert_conformal
        grib_grid_polar_stereographic
        grib_grid_space_view
        grib_g1fcperiod)

    # These tests do require data downloads
    list(APPEND tests_data_reqd
        grib_data_quality_checks
        grib_bpv_limit
        grib_complex
        grib_double_cmp
        grib_change_packing
        bufr_dump_data
        bufr_dump_descriptors
        bufr_dump_subset
        bufr_dump_decode_filter
        bufr_dump_encode_filter
        bufrdc_desc_ref
        bufrdc_ref
        bufr_compare
        bufr_copy
        bufr_count
        bufr_get
        bufr_filter_misc
        bufr_filter_extract_subsets
        bufr_filter_extract_datetime
        bufr_filter_extract_area
        bufr_filter_unpack_pack
        bufr_json_data
        bufr_ls
        bufr_ls_json
        bufr_change_edition
        bufr_keys_iter
        bufr_get_element
        bufr_wmo_tables
        bufr_extract_headers
        extract_offsets
        bufr_ecc-673
        bufr_ecc-428
        bufr_ecc-286
        bufr_ecc-288
        bufr_ecc-313
        bufr_ecc-616
        bufr_ecc-686
        bufr_ecc-690
        bufr_ecc-379
        bufr_ecc-393
        bufr_ecc-433
        bufr_ecc-750
        bufr_ecc-765
        bufr_ecc-875
        bufr_ecc-887
        bufr_ecc-1187
        grib_ecc-490
        grib_ecc-756
        grib_ecc-806
        grib_ecc-873
        grib_ecc-600
        grib_ecc-923
        grib_ecc-979
        grib_ecc-984
        grib_ecc-1000
        grib_ecc-1001
        grib_ecc-1030
        grib_set_bytes
        bufr_ecc-556
        gts_get
        gts_ls
        gts_count
        gts_compare
        metar_ls
        metar_get
        metar_dump
        metar_compare
        bufr_set
        ieee
        grib_sh_ieee64
        grib_optimize_scaling
        grib_optimize_scaling_sh
        grib_lam_bf
        grib_lam_gp
        grib1to2
        grib2to1
        grib1to3
        grib2to3
        grib2_templates
        grib2_chemicals_aerosols
        grib3_templates
        grib_bad
        grib_ls
        grib_ls_json
        grib_filter
        grib_multi
        grib_nearest_test
        pseudo_budg
        grib_gridType
        grib_octahedral
        grib_grid_mercator
        grib_global
        grib_concept
        grib_decimalPrecision
        grib_bitsPerValue
        grib_get_fail
        grib_missing
        grib_local
        grib_step
        grib_set
        grib_iterator
        grib_proj_string
        grib_compare
        grib_copy
        grib_level
        grib_indexing
        grib_bitmap
        grib_list
        grib_second_order
        grib_multi_from_message
        grib_change_scanning
        grib_statistics
        grib_tigge
        read_any
        grib_dump
        grib_dump_debug
        grib_dump_json
        grib_local_MeteoFrance
        grib_neg_fctime
        codes_split_file
        grib_mars_keys)

    if( HAVE_FORTRAN AND ENABLE_EXTRA_TESTS )
        list(APPEND tests_data_reqd bufr_dump_encode_fortran)
        list(APPEND tests_data_reqd bufr_dump_decode_fortran)
    endif()
    if( ENABLE_EXTRA_TESTS )
        list(APPEND tests_data_reqd grib_util_set_spec)
        list(APPEND tests_data_reqd grib_padding)
        list(APPEND tests_data_reqd grib_tigge_conversions1)
        list(APPEND tests_data_reqd grib_tigge_conversions2)
        list(APPEND tests_data_reqd bufr_dump_encode_C)
        list(APPEND tests_data_reqd bufr_dump_decode_C)
        list(APPEND tests_no_data_reqd list_codetable_flagtable_keys)
    endif()

    # These tests do not require any data downloads
    foreach( test ${tests_no_data_reqd} )
        ecbuild_add_test( TARGET  eccodes_t_${test}
                          TYPE    SCRIPT
                          LABELS  "sanity"
                          COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/${test}.sh )
    endforeach()
    ecbuild_add_test( TARGET eccodes_t_grib_check_gaussian_grids
                      TYPE SCRIPT
                      CONDITION ECCODES_INSTALL_EXTRA_TOOLS
                      COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/grib_check_gaussian_grids.sh )


    # Note: making the test dependent on the grib files (with DEPENDS)
    #       means they will be downloaded at "make" time
    #       rather than when you do "ctest". Use TEST_DEPENDS instead
    foreach( test ${tests_data_reqd} )
        ecbuild_add_test( TARGET eccodes_t_${test}
                      TYPE SCRIPT
                      CONDITION ENABLE_EXTRA_TESTS
                      COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/${test}.sh
                      RESOURCES asca_139.t1.ref
                      TEST_DEPENDS eccodes_download_gribs eccodes_download_tigge_gribs
                                   eccodes_download_bufrs eccodes_download_metars eccodes_download_gts )
    endforeach()

    if( HAVE_FORTRAN AND ENABLE_EXTRA_TESTS )
        set_tests_properties( eccodes_t_bufr_dump_encode_fortran PROPERTIES TIMEOUT 2500 )
    endif()
    if( ENABLE_EXTRA_TESTS )
        set_tests_properties( eccodes_t_bufr_dump_encode_C PROPERTIES TIMEOUT 2500 )
    endif()


    if( HAVE_PYTHON2 AND ENABLE_EXTRA_TESTS )
        list( APPEND ptests bufr_dump_decode_python )
        # list( APPEND ptests bufr_dump_encode_python )
        foreach( test ${ptests} )
            ecbuild_add_test( TARGET eccodes_t_${test}
                              TYPE SCRIPT
                              COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/${test}.sh
                              ENVIRONMENT PYTHON=${PYTHON_EXECUTABLE} PYTHONPATH=${PROJECT_BINARY_DIR}/python
                              TEST_DEPENDS eccodes_download_bufrs )
        endforeach()
    endif()

    ###########################################
    # Note: the reference file is in the tests dir not data dir!
    ecbuild_add_test( TARGET eccodes_t_grib_grid_lamb_az_eq_area
                      TYPE SCRIPT
                      CONDITION ENABLE_EXTRA_TESTS
                      COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/grib_grid_lamb_az_eq_area.sh
                      RESOURCES grib_lamb_az_eq_area.ref
                      TEST_DEPENDS eccodes_download_gribs )

    # These ones are conditional
    ###########################################
    ecbuild_add_test( TARGET eccodes_t_tools_data_from_stdin
                      TYPE SCRIPT
                      CONDITION NOT ECCODES_ON_WINDOWS AND ENABLE_EXTRA_TESTS
                      COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/tools_data_from_stdin.sh
                      TEST_DEPENDS eccodes_download_bufrs )

    ecbuild_add_test( TARGET eccodes_t_bufr_ecc-197
                      TYPE SCRIPT
                      CONDITION NOT ECCODES_ON_WINDOWS AND ENABLE_EXTRA_TESTS
                      COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/bufr_ecc-197.sh
                      TEST_DEPENDS eccodes_download_bufrs )

    if( ENABLE_EXTRA_TESTS AND HAVE_ECCODES_THREADS )
        ecbuild_add_executable( TARGET    grib_encode_pthreads
                                NOINSTALL
                                SOURCES   grib_encode_pthreads.c
                                LIBS      eccodes ${CMAKE_THREAD_LIBS_INIT} )
        ecbuild_add_test( TARGET eccodes_t_grib_encode_pthreads
                          TYPE SCRIPT
                          COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/grib_encode_pthreads.sh )

        foreach( test grib_threads_ecc-604 grib_threads_ecc-604-encode bufr_threads_ecc-604 )
            ecbuild_add_executable( TARGET    ${test}
                                    NOINSTALL
                                    SOURCES   ${test}.c
                                    LIBS      eccodes ${CMAKE_THREAD_LIBS_INIT} )
        endforeach()
        ecbuild_add_test( TARGET eccodes_t_grib_threads_ecc-604
                          TYPE SCRIPT
                          TEST_DEPENDS eccodes_download_gribs
                          COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/grib_threads_ecc-604.sh )
        ecbuild_add_test( TARGET eccodes_t_bufr_threads_ecc-604
                          TYPE SCRIPT
                          TEST_DEPENDS eccodes_download_bufrs
                          COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/bufr_threads_ecc-604.sh )
    endif()

    ecbuild_add_test( TARGET eccodes_t_grib_to_netcdf
                      TYPE SCRIPT
                      CONDITION HAVE_NETCDF AND ENABLE_EXTRA_TESTS
                      COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/grib_to_netcdf.sh
                      TEST_DEPENDS eccodes_download_gribs )

    ecbuild_add_test( TARGET eccodes_t_grib_jpeg
                      TYPE SCRIPT
                      CONDITION HAVE_JPEG AND ENABLE_EXTRA_TESTS
                      COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/grib_jpeg.sh
                      TEST_DEPENDS eccodes_download_gribs )

    ecbuild_add_test( TARGET eccodes_t_grib_png
                      TYPE SCRIPT
                      CONDITION HAVE_PNG AND ENABLE_EXTRA_TESTS
                      COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/grib_png.sh
                      TEST_DEPENDS eccodes_download_gribs )

    ecbuild_add_test( TARGET eccodes_t_grib_ccsds
                      TYPE SCRIPT
                      CONDITION HAVE_AEC AND ENABLE_EXTRA_TESTS
                      COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/grib_ccsds.sh
                      TEST_DEPENDS eccodes_download_gribs )

    ecbuild_add_test( TARGET eccodes_t_grib_check_param_concepts
                      TYPE SCRIPT
                      CONDITION ENABLE_EXTRA_TESTS
                      COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/grib_check_param_concepts.sh )

    ecbuild_add_test( TARGET eccodes_t_bufr_split_by_rdbSubtype
                      TYPE SCRIPT
                      CONDITION ENABLE_EXTRA_TESTS AND ECCODES_INSTALL_EXTRA_TOOLS
                      COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/bufr_split_by_rdbSubtype.sh
                      TEST_DEPENDS eccodes_download_bufrs )

    # Performance test. Must have -DENABLE_TIMER=ON
    ecbuild_add_test( TARGET eccodes_t_grib_ecc-386
                      TYPE SCRIPT
                      CONDITION ENABLE_EXTRA_TESTS AND ENABLE_TIMER
                      COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/grib_ecc-386.sh
                      TEST_DEPENDS eccodes_download_gribs )
else()
    # No command line tools
    list(APPEND tests_no_tools
        unit_tests
        julian
        bufr_check_descriptors
        grib_sh_imag
        grib_sh_spectral_complex
        grib_2nd_order_numValues
        grib_sh_ieee64)

    foreach( test ${tests_no_tools} )
    ecbuild_add_test( TARGET  eccodes_t_${test}
                      TYPE    SCRIPT
                      LABELS  "sanity"
                      COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/${test}.sh )
    endforeach()

endif()
